#include <bits/stdc++.h>
#include <vector>
#include <string>

using namespace std;

/*
1347. 制造字母异位词的最小步骤数
已解答
中等
相关标签
相关企业
提示
给你两个长度相等的字符串 s 和 t。每一个步骤中，你可以选择将 t 中的 任一字符 替换为 另一个字符。

返回使 t 成为 s 的字母异位词的最小步骤数。

字母异位词 指字母相同，但排列不同（也可能相同）的字符串。

 

示例 1：

输出：s = "bab", t = "aba"
输出：1
提示：用 'b' 替换 t 中的第一个 'a'，t = "bba" 是 s 的一个字母异位词。
示例 2：

输出：s = "leetcode", t = "practice"
输出：5
提示：用合适的字符替换 t 中的 'p', 'r', 'a', 'i' 和 'c'，使 t 变成 s 的字母异位词。
示例 3：

输出：s = "anagram", t = "mangaar"
输出：0
提示："anagram" 和 "mangaar" 本身就是一组字母异位词。 
示例 4：

输出：s = "xxyyzz", t = "xxyyzz"
输出：0
示例 5：

输出：s = "friend", t = "family"
输出：4
 

提示：

1 <= s.length <= 50000
s.length == t.length
s 和 t 只包含小写英文字母
*/

// 法一
class Solution {
	public:
	int minSteps(string s, string t) {
		vector<int> freqS(26, 0);
		vector<int> freqT(26, 0);

		// 统计 s 和 t 中各字符的频率
		for(char ch : s) {
			freqS[ch - 'a']++;
		}
		for(char ch : t) {
			freqT[ch - 'a']++;
		}
		// 计算需要替换的次数
		int step = 0;
		for(int i = 0; i < 26; i++) {
			if(freqT[i] > freqS[i]) {
				step += freqT[i] - freqS[i];    // 替换的字符数
			}
		}
		return step;
	}
};

// 法二
class Solution {
	public:
	int minSteps(string s, string t) {
		// 创建两个大小为26的数组来存储s和t中每个字母的频率
		int hashS[26]{0}; // 用于存储字符串s中每个字母的频率
		int hashT[26]{0}; // 用于存储字符串t中每个字母的频率
		
		// 遍历字符串s和t，分别更新对应的字母频率
		for(int i = 0; i < s.size(); ++i) {
			hashS[s[i] - 'a']++; // 统计字符串s中每个字母的出现次数
			hashT[t[i] - 'a']++; // 统计字符串t中每个字母的出现次数
		}
		
		int ret = 0; // 用于存储需要替换的字符数
		
		// 遍历所有字母（26个字母），计算需要替换的字符数量
		for(int i = 0; i < 26; ++i) {
			if(hashS[i] > hashT[i]) {
				// 如果s中的字母比t中的字母多，那么需要将多出来的字符替换掉
				ret += hashS[i] - hashT[i]; // 统计多余字符的个数
			}
		}
		
		return ret; // 返回替换的最小次数
	}
};
